package com.tensquare.user.service;

import com.alibaba.fastjson.JSON;
import com.tensquare.user.dao.UserDao;
import com.tensquare.user.pojo.User;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import utils.IdWorker;

import javax.transaction.Transactional;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * Created by WF on 2020/7/25 15:27
 */
@Service
@Transactional
public class UserService {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private UserDao userDao;
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
    //1.发送手机验证码
    public void sendSms(String mobile) {
        //第一部分：生成验证码
        //1.1)生成六位数的验证码
        int min = 100000;   //六位数的最小值
        int max = 999999;   //六位数的最大值
        //1.2)产生一个[max-min)范围的随机数，再加上最小值就是100000-999999范围内的随机数
        Random random = new Random();
        int rnd = random.nextInt(max - min);
        //1.3)产生随机数
        int code = rnd + min;

        //第二部分：发送消息
        //1.4）使用rabbitmq发送消息
        //1.4.1)封装信息
        Map map = new HashMap<>();
        map.put("mobile",mobile);               //手机号
        map.put("templateCode","SMS_148593167"); //模板code
        map.put("signName","品优购");            //签名
        Map paramMap = new HashMap();
        paramMap.put("code",code);              //验证码
        String param = JSON.toJSONString(paramMap);
        map.put("param",param);
        //1.4.2)使用rabbitmq发送消息
        rabbitTemplate.convertAndSend("sms",map);

        //第三部分：保存到redis中
        redisTemplate.opsForValue().set(mobile,code,10, TimeUnit.HOURS);
    }
    //2.检查用户输入的验证码是否正确
    public boolean isValid(String code, String mobile) {
        //2.1)得到redis中的验证码
        Integer validCode = (Integer) redisTemplate.opsForValue().get(mobile);
        //2.2)判断是否存在
         if(!StringUtils.isEmpty(validCode.toString()) && validCode.toString().equals(code)){
             return true;
         }
         return false;
    }
    //3.添加用户
    public void add(User user) {
        //3.1)设置用户id
        user.setId(idWorker.nextId() + "");
        //3.2)将密码加密
        user.setPassword(passwordEncoder.encode(user.getPassword()));
        //3.3)添加用户
        userDao.save(user);
    }
    //4.用户登录
    public User login(User user) {
        //4.1)根据手机号查询用户
        User loginUser = userDao.findByMobile(user.getMobile());
        //4.2)判断是否存在(matches方法的参数1：代表用户输入的密码 参数2：代表数据库中的加密后的密码)
        if(loginUser != null && passwordEncoder.matches(user.getPassword(),loginUser.getPassword())){
            return loginUser;
        }
        return null;
    }
    //5.删除用户
    public void delete(String userId) {
        userDao.deleteById(userId);
    }
    //6.增加粉丝数
    public void incfans(String userid, int x) {
        userDao.incfans(userid,x);
    }
    //7.增加关注数
    public void incfollow(String userid, int x) {
        userDao.incfollow(userid,x);
    }
}
